from django.shortcuts import render, redirect
from django.core.paginator import Paginator, EmptyPage, PageNotAnInteger
import importlib
from kingadmin.utils import table_filter, table_sort, table_search
# Create your views here.
from kingadmin import kingadmin
from kingadmin.froms import create_model_form
from django.contrib.auth.decorators import login_required
from crm.permissions import permission


@login_required
def index(request):
    return render(request, "kingadmin/table_index.html", {'table_list': kingadmin.enabled_admins})


@login_required
@permission.check_permission
def display_table_obj(request, app_name, table_name):
    print(app_name, table_name)
    # model_module = importlib.import_module('%s.models' % (app_name,))
    # model_obj = getattr(model_module, table_name)
    admin_class = kingadmin.enabled_admins[app_name][table_name]

    # action操作
    if request.method == "POST":
        print(request.POST)
        selected_ids = request.POST.get("selected_ids")
        action = request.POST.get("action")

        if selected_ids:
            selected_objs = admin_class.model.objects.filter(id__in=selected_ids.split(','))
        else:
            raise KeyError("No object selected.")
        if hasattr(admin_class, action):
            action_func = getattr(admin_class, action)
            request._admin_action = action
            return action_func(admin_class, request, selected_objs)

    # object_list = admin_class.model.objects.all()
    object_list, filter_conditions = table_filter(request, admin_class)  # 过滤后的结果

    object_list = table_search(request, admin_class, object_list)

    object_list, orderby_key = table_sort(request, admin_class, object_list)  # 排序后的结果
    print("orderby_key", orderby_key)
    paginator = Paginator(object_list, admin_class.list_per_page)  # Show 1 contacts per page

    page = request.GET.get('page')
    try:
        query_sets = paginator.page(page)
    except PageNotAnInteger:
        # If page is not an integer, deliver first page.
        query_sets = paginator.page(1)
    except EmptyPage:
        # If page is out of range (e.g. 9999), deliver last page of results.
        query_sets = paginator.page(paginator.num_pages)

    return render(request, "kingadmin/table_obj.html", {"admin_class": admin_class,
                                                        "query_sets": query_sets,
                                                        "filter_conditions": filter_conditions,
                                                        "orderby_key": orderby_key,
                                                        "previous_orderby": request.GET.get("o") or '',
                                                        "search_key": request.GET.get("_q") or ''})

@permission.check_permission
@login_required
def table_obj_change(request, app_name, table_name, obj_id):
    admin_class = kingadmin.enabled_admins[app_name][table_name]
    model_from_class = create_model_form(request, admin_class)
    obj = admin_class.model.objects.get(id=obj_id)
    if request.method == "POST":
        # post_data = request.POST.copy()
        # for field in admin_class.readonly_fields:
        #     field_val = getattr(obj, field)
        #     post_data[field] = field_val

        form_obj = model_from_class(request.POST, instance=obj)  # 更新
        if form_obj.is_valid():
            form_obj.save()
            father_html = "/%s/change/" % obj_id
            return redirect(request.path.replace(father_html, "/"))
    else:
        form_obj = model_from_class(instance=obj)
    return render(request, "kingadmin/table_obj_change.html", {"form_obj": form_obj,
                                                               "admin_class": admin_class,
                                                               "app_name": app_name,
                                                               "table_name": table_name,
                                                               })


@login_required
def table_obj_add(request, app_name, table_name):
    admin_class = kingadmin.enabled_admins[app_name][table_name]
    admin_class.is_add_form = True  # 添加是否是添加信息页面标识
    model_from_class = create_model_form(request, admin_class)

    if request.method == "POST":
        form_obj = model_from_class(request.POST)  # 更新
        if form_obj.is_valid():
            form_obj.save()
            return redirect(request.path.replace("/add/", "/"))
    else:
        form_obj = model_from_class()

    return render(request, "kingadmin/table_obj_add.html", {"form_obj": form_obj,
                                                            "admin_class": admin_class})


@login_required
def table_obj_delete(request, app_name, table_name, obj_id):
    admin_class = kingadmin.enabled_admins[app_name][table_name]
    obj = admin_class.model.objects.get(id=obj_id)
    obj = [obj, ]
    errors = {}
    if request.method == "POST":
        if not admin_class.readonly_table:
            obj.delete()
            return redirect("kingadmin/%s/%s/" % (app_name, table_name))

        else:
            errors = {"readonly_table": "table is readonly , obj [%s] cannot be delete" % obj}
    return render(request, "kingadmin/table_obj_delete.html", {"objs": obj,
                                                               "admin_class": admin_class,
                                                               "app_name": app_name,
                                                               "table_name": table_name,
                                                               "errors": errors})


@login_required
def password_reset(request, app_name, table_name, obj_id):
    admin_class = kingadmin.enabled_admins[app_name][table_name]
    obj = admin_class.model.objects.get(id=obj_id)
    errors = {}
    if request.method == "POST":
        _password1 = request.POST.get("password1")
        _password2 = request.POST.get("password2")

        if _password1 == _password2:
            if len(_password2) > 5:
                obj.set_password(_password1)
                obj.save()
                return redirect(request.path.rstrip("password/"))
            else:
                errors["password_too_short"] = "must not less than 6 letters"
        else:
            errors['invalid_password'] = "password are not the same"
    return render(request, 'kingadmin/password_reset.html', {"obj": obj,
                                                             "errors": errors,
                                                             })
